#pragma once

#include "../Headers/config.h"
#include "../Headers/types.h"

#include "ws.packer.h"
#include "ws.unpacker.h"
#include "ws.functions.h"
#include "ws.client.h"

#include <string>

#ifndef WS_CONFIG
#define WS_CONFIG ("ws-config.cfg")
#endif

namespace TOB {
  namespace WS {
  
    class WebServer {
    public:
      static TOB::Config config;
      /**
       * Функция запускающая непосредственно веб-сервер, который перенаправляет запрос на внутренние функции класса
       * @param unpacker распакованные данные запроса
       */
      static TOB::WS::Packer* ExecRequest(TOB::WS::Unpacker& unpacker);
    private:
      /**
       * Функция выдачи страницы
       * @param unpacker распакованные данные запроса
       */
      static TOB::WS::Data* GetPage(TOB::WS::Unpacker& unpacker);
      /**
       * Функция выдачи файла
       * @param unpacker распакованные данные запроса
       */
      static TOB::WS::Data* GetFile(TOB::WS::Unpacker& unpacker);
      /**
       * Функция приема файла
       * @param unpacker распакованные данные запроса
       */
      static TOB::WS::Data* SendFile(TOB::WS::Unpacker& unpacker);
    };
    
    class WebServerException {
    public:
      Code::Type error;
      WebServerException(std::string msg, Code::Type error);
    };
  }
}
